c++ - Visual C++ volatile
全部标签 我有时会在某些平台上看到以下C或C++代码的声明:int*ptr;*ptr=0;如果ptr碰巧存储了该端口映射到的地址,则可能导致写入硬件输入-输出端口。通常它们被称为“嵌入式平台”。这类平台的真实例子有哪些? 最佳答案 根据我的经验,大多数系统都使用内存映射I/O。x86平台有一个单独的、非内存映射的I/O地址空间(使用in/out系列处理器操作码),但PC架构还广泛使用标准内存地址空间进行设备I/O,具有更大的地址空间、更快的访问(通常)和更容易编程(通常)。我认为最初使用单独的I/O地址空间是因为处理器的内存地址空间有时非常有
volatile变量存储在程序存储器的什么位置(在哪个部分)? 最佳答案 volatile是typequalifier不是storageclassspecifier,所以它根本不确定存储位置;它影响变量类型的定义,而不是它的存储。它只是强制编译器从变量的存储位置(无论可能在哪里)显式读取type为volatile的变量,而不是假设某个先前读取的值例如,在寄存器中仍然有效。 关于c-易变的变量,我们在StackOverflow上找到一个类似的问题: https:
volatile变量存储在程序存储器的什么位置(在哪个部分)? 最佳答案 volatile是typequalifier不是storageclassspecifier,所以它根本不确定存储位置;它影响变量类型的定义,而不是它的存储。它只是强制编译器从变量的存储位置(无论可能在哪里)显式读取type为volatile的变量,而不是假设某个先前读取的值例如,在寄存器中仍然有效。 关于c-易变的变量,我们在StackOverflow上找到一个类似的问题: https:
在C中,假设您有一个名为variable_name的变量。假设它位于0xaaaaaaaa,在那个内存地址,你有整数123。换句话说,variable_name包含123。我正在寻找有关“variable_name位于0xaaaaaaaa”这一短语的说明。编译器如何识别字符串“variable_name”与该特定内存地址相关联?字符串“variable_name”是否存储在内存中的某个位置?编译器是否只是在看到0xaaaaaaaa时将其替换为variable_name,如果是这样,它是否不必使用内存来进行替换? 最佳答案 编译器运行后
在C中,假设您有一个名为variable_name的变量。假设它位于0xaaaaaaaa,在那个内存地址,你有整数123。换句话说,variable_name包含123。我正在寻找有关“variable_name位于0xaaaaaaaa”这一短语的说明。编译器如何识别字符串“variable_name”与该特定内存地址相关联?字符串“variable_name”是否存储在内存中的某个位置?编译器是否只是在看到0xaaaaaaaa时将其替换为variable_name,如果是这样,它是否不必使用内存来进行替换? 最佳答案 编译器运行后
我知道volatile不会在int上强制执行原子性,但如果您访问单个字节,它会这样做吗?如果我没记错的话,语义要求写入和读取始终来自内存。或者换句话说:CPU是否总是以原子方式读取和写入字节? 最佳答案 该标准不仅没有说明原子性,而且您甚至可能问错了问题。CPU通常以原子方式读取和写入单个字节。问题来了,因为当您有多个内核时,并非所有内核都会将字节视为已同时写入。事实上,在所有内核都看到写入之前,可能需要相当长的时间(用CPU来说,数千或数百万条指令(也就是微秒或毫秒))。因此,您需要有点名不副实的C++0x原子操作。他们使用CPU
我知道volatile不会在int上强制执行原子性,但如果您访问单个字节,它会这样做吗?如果我没记错的话,语义要求写入和读取始终来自内存。或者换句话说:CPU是否总是以原子方式读取和写入字节? 最佳答案 该标准不仅没有说明原子性,而且您甚至可能问错了问题。CPU通常以原子方式读取和写入单个字节。问题来了,因为当您有多个内核时,并非所有内核都会将字节视为已同时写入。事实上,在所有内核都看到写入之前,可能需要相当长的时间(用CPU来说,数千或数百万条指令(也就是微秒或毫秒))。因此,您需要有点名不副实的C++0x原子操作。他们使用CPU
我编写了一段C代码来说明关于优化和分支预测的讨论中的一个观点。然后我注意到比我预期的更多样化的结果。我的目标是用一种介于C++和C之间的通用子集的语言编写它,这两种语言都符合标准并且相当可移植。它在不同的WindowsPC上进行了测试:#include#include///@return-timedifferencebetweenstartandstopinmillisecondsintms_elapsed(clock_tstart,clock_tstop){return(int)(1000.0*(stop-start)/CLOCKS_PER_SEC);}intconstBillion
我编写了一段C代码来说明关于优化和分支预测的讨论中的一个观点。然后我注意到比我预期的更多样化的结果。我的目标是用一种介于C++和C之间的通用子集的语言编写它,这两种语言都符合标准并且相当可移植。它在不同的WindowsPC上进行了测试:#include#include///@return-timedifferencebetweenstartandstopinmillisecondsintms_elapsed(clock_tstart,clock_tstop){return(int)(1000.0*(stop-start)/CLOCKS_PER_SEC);}intconstBillion
(与此问题IsItSafetoCastAwayvolatile?相关,但不完全相同,因为该问题与特定实例有关)是否有过抛弃volatile被不视为危险做法的情况?(一个特别的例子:如果声明了一个函数voidfoo(long*pl);我必须实现voidbar(volatilelong*pl);由于我的部分实现需要bar()调用foo(pl),那么我似乎无法让它按原样工作,因为编译foo()和编译bar()的调用者不兼容。)作为推论,如果我有一个volatile变量v,并且我想用别人的函数voidfoo(long*pl),那个人告诉我它是安全的,我可以在调用之前直接转换指针,我的直觉是告诉